home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / esc.jar / com / extensibility / rock / RJMenu.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-06-30  |  13.7 KB  |  630 lines

  1. package com.extensibility.rock;
  2.  
  3. import java.awt.Component;
  4. import java.awt.Container;
  5. import java.awt.Dimension;
  6. import java.awt.Point;
  7. import java.awt.Toolkit;
  8. import java.awt.event.InputEvent;
  9. import java.awt.event.KeyEvent;
  10. import java.beans.PropertyChangeListener;
  11. import java.io.IOException;
  12. import java.io.ObjectOutputStream;
  13. import java.util.Enumeration;
  14. import java.util.Hashtable;
  15. import java.util.Vector;
  16. import javax.accessibility.AccessibleContext;
  17. import javax.accessibility.AccessibleState;
  18. import javax.swing.AbstractButton;
  19. import javax.swing.Action;
  20. import javax.swing.ButtonModel;
  21. import javax.swing.Icon;
  22. import javax.swing.JComponent;
  23. import javax.swing.JMenu;
  24. import javax.swing.JMenuBar;
  25. import javax.swing.JMenuItem;
  26. import javax.swing.JPopupMenu;
  27. import javax.swing.KeyStroke;
  28. import javax.swing.MenuElement;
  29. import javax.swing.MenuSelectionManager;
  30. import javax.swing.UIManager;
  31. import javax.swing.event.ChangeListener;
  32. import javax.swing.event.MenuEvent;
  33. import javax.swing.event.MenuListener;
  34. import javax.swing.plaf.MenuItemUI;
  35. import javax.swing.plaf.PopupMenuUI;
  36.  
  37. public class RJMenu extends JMenu {
  38.    private static final String uiClassID = "MenuUI";
  39.    private JPopupMenu popupMenu;
  40.    private ChangeListener menuChangeListener;
  41.    private MenuEvent menuEvent;
  42.    private static Hashtable listenerRegistry = null;
  43.    private int delay;
  44.  
  45.    public RJMenu() {
  46.       this("");
  47.    }
  48.  
  49.    public RJMenu(String var1) {
  50.       super(var1);
  51.       this.menuChangeListener = null;
  52.       this.menuEvent = null;
  53.    }
  54.  
  55.    public RJMenu(String var1, boolean var2) {
  56.       this(var1);
  57.    }
  58.  
  59.    public void updateUI() {
  60.       ((JMenuItem)this).setUI((MenuItemUI)UIManager.getUI(this));
  61.       if (this.popupMenu != null) {
  62.          this.popupMenu.setUI((PopupMenuUI)UIManager.getUI(this.popupMenu));
  63.       }
  64.  
  65.    }
  66.  
  67.    public String getUIClassID() {
  68.       return "MenuUI";
  69.    }
  70.  
  71.    public void setModel(ButtonModel var1) {
  72.       ButtonModel var2 = ((AbstractButton)this).getModel();
  73.       super.setModel(var1);
  74.       if (var2 != null && this.menuChangeListener != null) {
  75.          var2.removeChangeListener(this.menuChangeListener);
  76.          this.menuChangeListener = null;
  77.       }
  78.  
  79.       super.model = var1;
  80.       if (var1 != null) {
  81.          this.menuChangeListener = this.createMenuChangeListener();
  82.          var1.addChangeListener(this.menuChangeListener);
  83.       }
  84.  
  85.    }
  86.  
  87.    public boolean isSelected() {
  88.       return ((AbstractButton)this).getModel().isSelected();
  89.    }
  90.  
  91.    public void setSelected(boolean var1) {
  92.       ButtonModel var2 = ((AbstractButton)this).getModel();
  93.       boolean var3 = var2.isSelected();
  94.       if (super.accessibleContext != null && var3 != var1) {
  95.          if (var1) {
  96.             super.accessibleContext.firePropertyChange("AccessibleState", (Object)null, AccessibleState.SELECTED);
  97.          } else {
  98.             super.accessibleContext.firePropertyChange("AccessibleState", AccessibleState.SELECTED, (Object)null);
  99.          }
  100.       }
  101.  
  102.       if (var1 != var2.isSelected()) {
  103.          ((AbstractButton)this).getModel().setSelected(var1);
  104.       }
  105.  
  106.    }
  107.  
  108.    public boolean isPopupMenuVisible() {
  109.       this.ensurePopupMenuCreated();
  110.       return this.popupMenu.isVisible();
  111.    }
  112.  
  113.    public void setPopupMenuVisible(boolean var1) {
  114.       if (((Component)this).isEnabled()) {
  115.          boolean var2 = this.isPopupMenuVisible();
  116.          if (var1 != var2) {
  117.             this.ensurePopupMenuCreated();
  118.             if (var1 && ((Component)this).isShowing()) {
  119.                Point var3 = this.getPopupMenuOrigin();
  120.                this.getPopupMenu().show(this, var3.x, var3.y);
  121.             } else {
  122.                this.getPopupMenu().setVisible(false);
  123.             }
  124.          }
  125.  
  126.       }
  127.    }
  128.  
  129.    private Point getPopupMenuOrigin() {
  130.       int var1 = 0;
  131.       int var2 = 0;
  132.       JPopupMenu var3 = this.getPopupMenu();
  133.       Dimension var4 = Toolkit.getDefaultToolkit().getScreenSize();
  134.       Dimension var5 = ((Component)this).getSize();
  135.       Dimension var6 = ((Component)var3).getSize();
  136.       if (var6.width == 0) {
  137.          var6 = ((JComponent)var3).getPreferredSize();
  138.       }
  139.  
  140.       Point var7 = ((Component)this).getLocationOnScreen();
  141.       Container var8 = ((Component)this).getParent();
  142.       if (var8 instanceof JPopupMenu) {
  143.          if (var7.x + var5.width + var6.width < var4.width) {
  144.             var1 = var5.width;
  145.          } else {
  146.             var1 = 0 - var6.width;
  147.          }
  148.  
  149.          if (var7.y + var6.height < var4.height) {
  150.             var2 = 0;
  151.          } else {
  152.             var2 = var5.height - var6.height;
  153.          }
  154.       } else {
  155.          if (var7.x + var6.width < var4.width) {
  156.             var1 = 0;
  157.          } else {
  158.             var1 = var5.width - var6.width;
  159.          }
  160.  
  161.          if (var7.y + var5.height + var6.height < var4.height) {
  162.             var2 = var5.height;
  163.          } else {
  164.             var2 = 0 - var6.height;
  165.          }
  166.       }
  167.  
  168.       return new Point(var1, var2);
  169.    }
  170.  
  171.    public int getDelay() {
  172.       return this.delay;
  173.    }
  174.  
  175.    public void setDelay(int var1) {
  176.       if (var1 < 0) {
  177.          throw new IllegalArgumentException("Delay must be a positive integer");
  178.       } else {
  179.          this.delay = var1;
  180.       }
  181.    }
  182.  
  183.    private void ensurePopupMenuCreated() {
  184.       if (this.popupMenu == null) {
  185.          this.popupMenu = new JPopupMenu();
  186.          this.popupMenu.setInvoker(this);
  187.          super.popupListener = ((JMenu)this).createWinListener(this.popupMenu);
  188.          this.popupMenu.addPopupMenuListener(new 1(this));
  189.       }
  190.  
  191.    }
  192.  
  193.    public void setMenuLocation(int var1, int var2) {
  194.       if (this.popupMenu != null) {
  195.          this.popupMenu.setLocation(var1, var2);
  196.       }
  197.  
  198.    }
  199.  
  200.    public JMenuItem add(JMenuItem var1) {
  201.       AccessibleContext var2 = var1.getAccessibleContext();
  202.       var2.setAccessibleParent(this);
  203.       this.ensurePopupMenuCreated();
  204.       return this.popupMenu.add(var1);
  205.    }
  206.  
  207.    public Component add(Component var1) {
  208.       if (var1 instanceof JComponent) {
  209.          AccessibleContext var2 = ((JComponent)var1).getAccessibleContext();
  210.          if (var2 != null) {
  211.             var2.setAccessibleParent(this);
  212.          }
  213.       }
  214.  
  215.       this.ensurePopupMenuCreated();
  216.       this.popupMenu.add(var1);
  217.       return var1;
  218.    }
  219.  
  220.    public JMenuItem add(String var1) {
  221.       return this.add(new JMenuItem(var1));
  222.    }
  223.  
  224.    public JMenuItem add(Action var1) {
  225.       JMenuItem var2 = new JMenuItem((String)var1.getValue("Name"), (Icon)var1.getValue("SmallIcon"));
  226.       ((AbstractButton)var2).setHorizontalTextPosition(4);
  227.       ((AbstractButton)var2).setVerticalTextPosition(0);
  228.       var2.setEnabled(var1.isEnabled());
  229.       ((AbstractButton)var2).addActionListener(var1);
  230.       this.add(var2);
  231.       this.registerMenuItemForAction(var2, var1);
  232.       return var2;
  233.    }
  234.  
  235.    protected PropertyChangeListener createActionChangeListener(JMenuItem var1) {
  236.       return new ActionChangedListener(var1);
  237.    }
  238.  
  239.    public void addSeparator() {
  240.       this.ensurePopupMenuCreated();
  241.       this.popupMenu.addSeparator();
  242.    }
  243.  
  244.    public void insert(String var1, int var2) {
  245.       if (var2 < 0) {
  246.          throw new IllegalArgumentException("index less than zero.");
  247.       } else {
  248.          this.ensurePopupMenuCreated();
  249.          this.popupMenu.insert(new JMenuItem(var1), var2);
  250.       }
  251.    }
  252.  
  253.    public JMenuItem insert(JMenuItem var1, int var2) {
  254.       if (var2 < 0) {
  255.          throw new IllegalArgumentException("index less than zero.");
  256.       } else {
  257.          AccessibleContext var3 = var1.getAccessibleContext();
  258.          var3.setAccessibleParent(this);
  259.          this.ensurePopupMenuCreated();
  260.          this.popupMenu.insert(var1, var2);
  261.          return var1;
  262.       }
  263.    }
  264.  
  265.    public JMenuItem insert(Action var1, int var2) {
  266.       if (var2 < 0) {
  267.          throw new IllegalArgumentException("index less than zero.");
  268.       } else {
  269.          this.ensurePopupMenuCreated();
  270.          JMenuItem var3 = new JMenuItem((String)var1.getValue("Name"), (Icon)var1.getValue("SmallIcon"));
  271.          ((AbstractButton)var3).setHorizontalTextPosition(4);
  272.          ((AbstractButton)var3).setVerticalTextPosition(0);
  273.          var3.setEnabled(var1.isEnabled());
  274.          ((AbstractButton)var3).addActionListener(var1);
  275.          this.popupMenu.insert(var3, var2);
  276.          this.registerMenuItemForAction(var3, var1);
  277.          return var3;
  278.       }
  279.    }
  280.  
  281.    private void registerMenuItemForAction(JMenuItem var1, Action var2) {
  282.       PropertyChangeListener var3 = this.createActionChangeListener(var1);
  283.       if (listenerRegistry == null) {
  284.          listenerRegistry = new Hashtable();
  285.       }
  286.  
  287.       listenerRegistry.put(var1, var3);
  288.       listenerRegistry.put(var3, var2);
  289.       var2.addPropertyChangeListener(var3);
  290.    }
  291.  
  292.    private void unregisterMenuItemForAction(JMenuItem var1) {
  293.       if (listenerRegistry != null) {
  294.          ActionChangedListener var2 = (ActionChangedListener)listenerRegistry.remove(var1);
  295.          if (var2 != null) {
  296.             Action var3 = (Action)listenerRegistry.remove(var2);
  297.             if (var3 != null) {
  298.                ((AbstractButton)var1).removeActionListener(var3);
  299.                var3.removePropertyChangeListener(var2);
  300.             }
  301.  
  302.             var2.setTarget((JMenuItem)null);
  303.          }
  304.       }
  305.  
  306.    }
  307.  
  308.    private void clearListenerRegistry() {
  309.       if (listenerRegistry != null) {
  310.          Enumeration var1 = listenerRegistry.keys();
  311.  
  312.          while(var1.hasMoreElements()) {
  313.             Object var2 = var1.nextElement();
  314.             if (var2 == this) {
  315.                JMenuItem var3 = (JMenuItem)var2;
  316.                ActionChangedListener var4 = (ActionChangedListener)listenerRegistry.get(var3);
  317.                if (var4 != null) {
  318.                   Action var5 = (Action)listenerRegistry.get(var4);
  319.                   if (var5 != null) {
  320.                      ((AbstractButton)var3).removeActionListener(var5);
  321.                      var5.removePropertyChangeListener(var4);
  322.                   }
  323.  
  324.                   var4.setTarget((JMenuItem)null);
  325.                }
  326.             }
  327.          }
  328.  
  329.          listenerRegistry.clear();
  330.       }
  331.  
  332.    }
  333.  
  334.    public void insertSeparator(int var1) {
  335.       if (var1 < 0) {
  336.          throw new IllegalArgumentException("index less than zero.");
  337.       } else {
  338.          this.ensurePopupMenuCreated();
  339.          this.popupMenu.insert(new JPopupMenu.Separator(), var1);
  340.       }
  341.    }
  342.  
  343.    public JMenuItem getItem(int var1) {
  344.       if (var1 < 0) {
  345.          throw new IllegalArgumentException("index less than zero.");
  346.       } else {
  347.          Component var2 = this.getMenuComponent(var1);
  348.          if (var2 instanceof JMenuItem) {
  349.             JMenuItem var3 = (JMenuItem)var2;
  350.             return var3;
  351.          } else {
  352.             return null;
  353.          }
  354.       }
  355.    }
  356.  
  357.    public int getItemCount() {
  358.       return this.getMenuComponentCount();
  359.    }
  360.  
  361.    public boolean isTearOff() {
  362.       throw new Error("boolean isTearOff() {} not yet implemented");
  363.    }
  364.  
  365.    public void remove(JMenuItem var1) {
  366.       if (this.popupMenu != null) {
  367.          this.popupMenu.remove(var1);
  368.       }
  369.  
  370.       this.unregisterMenuItemForAction(var1);
  371.    }
  372.  
  373.    public void remove(int var1) {
  374.       if (var1 < 0) {
  375.          throw new IllegalArgumentException("index less than zero.");
  376.       } else if (var1 > this.getItemCount()) {
  377.          throw new IllegalArgumentException("index greater than the number of items.");
  378.       } else {
  379.          JMenuItem var2 = this.getItem(var1);
  380.          if (var2 instanceof JMenuItem) {
  381.             this.unregisterMenuItemForAction(var2);
  382.          }
  383.  
  384.          if (this.popupMenu != null) {
  385.             this.popupMenu.remove(var1);
  386.          }
  387.  
  388.       }
  389.    }
  390.  
  391.    public void remove(Component var1) {
  392.       if (this.popupMenu != null) {
  393.          this.popupMenu.remove(var1);
  394.       }
  395.  
  396.    }
  397.  
  398.    public void removeAll() {
  399.       if (this.popupMenu != null) {
  400.          this.popupMenu.removeAll();
  401.       }
  402.  
  403.       this.clearListenerRegistry();
  404.    }
  405.  
  406.    public int getMenuComponentCount() {
  407.       int var1 = 0;
  408.       if (this.popupMenu != null) {
  409.          var1 = this.popupMenu.getComponentCount();
  410.       }
  411.  
  412.       return var1;
  413.    }
  414.  
  415.    public Component getMenuComponent(int var1) {
  416.       return this.popupMenu != null ? this.popupMenu.getComponent(var1) : null;
  417.    }
  418.  
  419.    public Component[] getMenuComponents() {
  420.       return this.popupMenu != null ? this.popupMenu.getComponents() : new Component[0];
  421.    }
  422.  
  423.    public boolean isTopLevelMenu() {
  424.       return ((Component)this).getParent() instanceof JMenuBar;
  425.    }
  426.  
  427.    public boolean isMenuComponent(Component var1) {
  428.       if (var1 == this) {
  429.          return true;
  430.       } else {
  431.          if (var1 instanceof JPopupMenu) {
  432.             JPopupMenu var2 = (JPopupMenu)var1;
  433.             if (var2 == this.getPopupMenu()) {
  434.                return true;
  435.             }
  436.          }
  437.  
  438.          int var7 = this.getMenuComponentCount();
  439.          Component[] var3 = this.getMenuComponents();
  440.  
  441.          for(int var4 = 0; var4 < var7; ++var4) {
  442.             Component var5 = var3[var4];
  443.             if (var5 == var1) {
  444.                return true;
  445.             }
  446.  
  447.             if (var5 instanceof RJMenu) {
  448.                RJMenu var6 = (RJMenu)var5;
  449.                if (var6.isMenuComponent(var1)) {
  450.                   return true;
  451.                }
  452.             }
  453.          }
  454.  
  455.          return false;
  456.       }
  457.    }
  458.  
  459.    private Point translateToPopupMenu(Point var1) {
  460.       return this.translateToPopupMenu(var1.x, var1.y);
  461.    }
  462.  
  463.    private Point translateToPopupMenu(int var1, int var2) {
  464.       int var3;
  465.       int var4;
  466.       if (((Component)this).getParent() instanceof JPopupMenu) {
  467.          var3 = var1 - ((Component)this).getSize().width;
  468.          var4 = var2;
  469.       } else {
  470.          var3 = var1;
  471.          var4 = var2 - ((Component)this).getSize().height;
  472.       }
  473.  
  474.       return new Point(var3, var4);
  475.    }
  476.  
  477.    public JPopupMenu getPopupMenu() {
  478.       this.ensurePopupMenuCreated();
  479.       return this.popupMenu;
  480.    }
  481.  
  482.    public void addMenuListener(MenuListener var1) {
  483.       super.listenerList.add(Class.forName("javax.swing.event.MenuListener"), var1);
  484.    }
  485.  
  486.    public void removeMenuListener(MenuListener var1) {
  487.       super.listenerList.remove(Class.forName("javax.swing.event.MenuListener"), var1);
  488.    }
  489.  
  490.    protected void fireMenuSelected() {
  491.       Object[] var1 = super.listenerList.getListenerList();
  492.  
  493.       for(int var2 = var1.length - 2; var2 >= 0; var2 -= 2) {
  494.          if (var1[var2] == Class.forName("javax.swing.event.MenuListener")) {
  495.             if (var1[var2 + 1] == null) {
  496.                throw new Error(String.valueOf(String.valueOf(((AbstractButton)this).getText()).concat(String.valueOf(" has a NULL Listener!! "))).concat(String.valueOf(var2)));
  497.             }
  498.  
  499.             if (this.menuEvent == null) {
  500.                this.menuEvent = new MenuEvent(this);
  501.             }
  502.  
  503.             ((MenuListener)var1[var2 + 1]).menuSelected(this.menuEvent);
  504.          }
  505.       }
  506.  
  507.    }
  508.  
  509.    protected void fireMenuDeselected() {
  510.       Object[] var1 = super.listenerList.getListenerList();
  511.  
  512.       for(int var2 = var1.length - 2; var2 >= 0; var2 -= 2) {
  513.          if (var1[var2] == Class.forName("javax.swing.event.MenuListener")) {
  514.             if (var1[var2 + 1] == null) {
  515.                throw new Error(String.valueOf(String.valueOf(((AbstractButton)this).getText()).concat(String.valueOf(" has a NULL Listener!! "))).concat(String.valueOf(var2)));
  516.             }
  517.  
  518.             if (this.menuEvent == null) {
  519.                this.menuEvent = new MenuEvent(this);
  520.             }
  521.  
  522.             ((MenuListener)var1[var2 + 1]).menuDeselected(this.menuEvent);
  523.          }
  524.       }
  525.  
  526.    }
  527.  
  528.    protected void fireMenuCanceled() {
  529.       Object[] var1 = super.listenerList.getListenerList();
  530.  
  531.       for(int var2 = var1.length - 2; var2 >= 0; var2 -= 2) {
  532.          if (var1[var2] == Class.forName("javax.swing.event.MenuListener")) {
  533.             if (var1[var2 + 1] == null) {
  534.                throw new Error(String.valueOf(String.valueOf(((AbstractButton)this).getText()).concat(String.valueOf(" has a NULL Listener!! "))).concat(String.valueOf(var2)));
  535.             }
  536.  
  537.             if (this.menuEvent == null) {
  538.                this.menuEvent = new MenuEvent(this);
  539.             }
  540.  
  541.             ((MenuListener)var1[var2 + 1]).menuCanceled(this.menuEvent);
  542.          }
  543.       }
  544.  
  545.    }
  546.  
  547.    private ChangeListener createMenuChangeListener() {
  548.       return new MenuChangeListener(this);
  549.    }
  550.  
  551.    public void menuSelectionChanged(boolean var1) {
  552.       this.setSelected(var1);
  553.    }
  554.  
  555.    public MenuElement[] getSubElements() {
  556.       if (this.popupMenu == null) {
  557.          return new MenuElement[0];
  558.       } else {
  559.          MenuElement[] var1 = new MenuElement[]{this.popupMenu};
  560.          return var1;
  561.       }
  562.    }
  563.  
  564.    public Component getComponent() {
  565.       return this;
  566.    }
  567.  
  568.    public void setAccelerator(KeyStroke var1) {
  569.       throw new Error("setAccelerator() is not defined for JMenu.  Use setMnemonic() instead.");
  570.    }
  571.  
  572.    protected void processKeyEvent(KeyEvent var1) {
  573.       MenuSelectionManager.defaultManager().processKeyEvent(var1);
  574.       if (!((InputEvent)var1).isConsumed()) {
  575.          if (this.isSelected() && (var1.getKeyCode() == 9 || var1.getKeyChar() == '\t')) {
  576.             if ((Boolean)UIManager.get("Menu.consumesTabs") == Boolean.TRUE) {
  577.                ((InputEvent)var1).consume();
  578.                return;
  579.             }
  580.  
  581.             MenuSelectionManager.defaultManager().clearSelectedPath();
  582.          }
  583.  
  584.          super.processKeyEvent(var1);
  585.       }
  586.    }
  587.  
  588.    public void doClick(int var1) {
  589.       MenuElement[] var2 = this.buildMenuElementArray(this);
  590.       MenuSelectionManager.defaultManager().setSelectedPath(var2);
  591.    }
  592.  
  593.    private MenuElement[] buildMenuElementArray(RJMenu var1) {
  594.       Vector var2 = new Vector();
  595.       Object var3 = var1.getPopupMenu();
  596.  
  597.       while(true) {
  598.          while(!(var3 instanceof JPopupMenu)) {
  599.             if (var3 instanceof RJMenu) {
  600.                RJMenu var5 = (RJMenu)var3;
  601.                var2.insertElementAt(var5, 0);
  602.                var3 = ((Component)var5).getParent();
  603.             } else if (var3 instanceof JMenuBar) {
  604.                JMenuBar var6 = (JMenuBar)var3;
  605.                var2.insertElementAt(var6, 0);
  606.                MenuElement[] var7 = new MenuElement[var2.size()];
  607.                var2.copyInto(var7);
  608.                return var7;
  609.             }
  610.          }
  611.  
  612.          JPopupMenu var4 = (JPopupMenu)var3;
  613.          var2.insertElementAt(var4, 0);
  614.          var3 = var4.getInvoker();
  615.       }
  616.    }
  617.  
  618.    private void writeObject(ObjectOutputStream var1) throws IOException {
  619.       var1.defaultWriteObject();
  620.       if (super.ui != null && this.getUIClassID().equals("MenuUI")) {
  621.          super.ui.installUI(this);
  622.       }
  623.  
  624.    }
  625.  
  626.    protected String paramString() {
  627.       return super.paramString();
  628.    }
  629. }
  630.